package com.jiang.daily.Q2266;

/**
 * @author Jiang
 * @version 1.0
 * @date 2025/01/19 22:09
 */
public class Solution {
    public int countTexts(String pressedKeys) {
        final int MOD = 1000000007;

        int[] dp = new int[5];
        dp[0] = dp[1] = 1;

        int cnt = 1;
        for (int i = 1; i < pressedKeys.length(); ++i) {
            // 统计某个数字重复出现的次数
            if (pressedKeys.charAt(i) == pressedKeys.charAt(i - 1)) {
                ++cnt;
            } else {
                cnt = 1;
            }
            // 重复出现一次，选前面一个，两次两个，三次三个，大于等于四次（如果是9 或 7 是四个，如果是其它是三个），这也是dp数组长度为5的原因，最多也只用前面四个元素
            int len = Math.min(cnt, pressedKeys.charAt(i) == '7' || pressedKeys.charAt(i) == '9' ? 4 : 3);
            // 当前元素在数组中的索引
            int ii = (i + 1) % 5;
            // 先去除之前保存在第ii位置的值为前一个（也可以设为0，在循环中从1开始）
            dp[ii] = dp[i % 5];
            for (int j = 2; j <= len; ++j) {
                dp[ii] = (dp[ii] + dp[(ii - j + 5) % 5]) % MOD;
            }
        }
        return dp[pressedKeys.length() % 5];
    }
}

